#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
微信联系人导出工具 - 打包脚本

功能：
- 使用PyInstaller将项目打包成Windows可执行文件
- 自动包含所有必要的资源文件
- 配置应用程序图标和元数据

使用方法：
python build_exe.py
"""

import os
import sys
import subprocess
import shutil
from pathlib import Path

def check_pyinstaller():
    """
    检查PyInstaller是否已安装
    
    返回值：
    - bool: PyInstaller是否可用
    """
    try:
        import PyInstaller
        print("✓ PyInstaller 已安装")
        return True
    except ImportError:
        print("✗ PyInstaller 未安装，正在安装...")
        try:
            subprocess.check_call([sys.executable, "-m", "pip", "install", "pyinstaller"])
            print("✓ PyInstaller 安装成功")
            return True
        except subprocess.CalledProcessError:
            print("✗ PyInstaller 安装失败")
            return False

def create_spec_file():
    """
    创建PyInstaller spec文件
    
    返回值：
    - str: spec文件内容
    """
    spec_content = '''# -*- mode: python ; coding: utf-8 -*-

import sys
from pathlib import Path

# 添加当前目录到路径
sys.path.insert(0, str(Path(__file__).parent))

block_cipher = None

a = Analysis(
    ['main.py'],
    pathex=[],
    binaries=[],
    datas=[
        # 包含data目录
        ('data', 'data'),
        # 包含output目录
        ('output', 'output'),
    ],
    hiddenimports=[],
    hookspath=[],
    hooksconfig={},
    runtime_hooks=[],
    excludes=[],
    win_no_prefer_redirects=False,
    win_private_assemblies=False,
    cipher=block_cipher,
    noarchive=False,
)

# 添加tkinter相关文件
if sys.platform == 'win32':
    a.binaries.extend([
        ('tcl86t.dll', 'C:\\\\Windows\\\\System32\\\\tcl86t.dll', 'BINARY'),
        ('tk86t.dll', 'C:\\\\Windows\\\\System32\\\\tk86t.dll', 'BINARY'),
    ])

pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)

exe = EXE(
    pyz,
    a.scripts,
    a.binaries,
    a.zipfiles,
    a.datas,
    [],
    name='微信联系人导出工具',
    debug=False,
    bootloader_ignore_signals=False,
    strip=False,
    upx=True,
    upx_exclude=[],
    runtime_tmpdir=None,
    console=False,  # 不显示控制台窗口
    disable_windowed_traceback=False,
    argv_emulation=False,
    target_arch=None,
    codesign_identity=None,
    entitlements_file=None,
    icon=None,  # 可以添加图标文件路径
)
'''
    
    return spec_content

def build_executable():
    """
    构建可执行文件
    
    返回值：
    - bool: 构建是否成功
    """
    print("开始构建可执行文件...")
    
    # 创建dist和build目录（如果不存在）
    dist_dir = Path("dist")
    build_dir = Path("build")
    
    # 清理之前的构建结果
    if dist_dir.exists():
        shutil.rmtree(dist_dir)
    if build_dir.exists():
        shutil.rmtree(build_dir)
    
    # 构建命令
    cmd = [
        sys.executable, "-m", "PyInstaller",
        "--name=微信联系人导出工具ForWX-V3",
        "--onefile",  # 打包成单个exe文件
        "--windowed",  # 不显示控制台窗口
        "--hidden-import=pandas",
        "--hidden-import=openpyxl",
        "--hidden-import=tkinter",
        "--hidden-import=pywxdump",
        "--hidden-import=pywxdump.api",
        "--hidden-import=pywxdump.db",
        "--hidden-import=pywxdump.wx_core",
        "--clean",  # 清理临时文件
        "main.py"
    ]
    
    try:
        print("执行打包命令...")
        result = subprocess.run(cmd, capture_output=True, text=True, cwd=os.getcwd())
        
        if result.returncode == 0:
            print("✓ 打包成功！")
            print(f"可执行文件位置: {dist_dir / '微信联系人导出工具ForWX-V3.exe'}")
            
            # 检查生成的文件
            exe_path = dist_dir / "微信联系人导出工具ForWX-V3.exe"
            if exe_path.exists():
                file_size = exe_path.stat().st_size / (1024 * 1024)  # MB
                print(f"文件大小: {file_size:.2f} MB")
                return True
            else:
                print("✗ 可执行文件未生成")
                return False
        else:
            print("✗ 打包失败")
            print("错误信息:")
            print(result.stderr)
            return False
            
    except Exception as e:
        print(f"✗ 打包过程中出现错误: {e}")
        return False

def create_launcher_script():
    """
    创建启动脚本（可选）
    """
    launcher_content = '''@echo off
chcp 65001 > nul
echo 正在启动微信联系人导出工具...
"dist\\微信联系人导出工具.exe"
pause
'''
    
    with open("启动工具.bat", "w", encoding="utf-8") as f:
        f.write(launcher_content)
    
    print("✓ 启动脚本已创建: 启动工具.bat")

def main():
    """
    主函数
    """
    print("=" * 50)
    print("微信联系人导出工具 - 打包程序")
    print("=" * 50)
    
    # 检查当前目录
    current_dir = Path(__file__).parent
    print(f"工作目录: {current_dir}")
    
    # 检查main.py是否存在
    if not (current_dir / "main.py").exists():
        print("✗ 错误: main.py 文件不存在")
        return
    
    # 检查PyInstaller
    if not check_pyinstaller():
        print("✗ 无法继续，PyInstaller安装失败")
        return
    
    # 构建可执行文件
    if build_executable():
        # 创建启动脚本
        create_launcher_script()
        
        print("\n" + "=" * 50)
        print("打包完成！")
        print("可执行文件位置: dist\\微信联系人导出工具ForWX-V3.exe")
        print("启动脚本: 启动工具.bat")
        print("=" * 50)
        
        # 显示使用说明
        print("\n使用说明:")
        print("1. 直接运行 'dist\\微信联系人导出工具ForWX-V3.exe'")
        print("2. 或运行 '启动工具.bat' 启动程序")
        print("3. 确保data目录和可执行文件在同一目录下")
        
    else:
        print("\n✗ 打包失败，请检查错误信息")

if __name__ == "__main__":
    main()